1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105
| #include "fun.h" #include <bits/stdc++.h> #define rep(i, x, y) for (int i = x; i <= y; i++) #define per(i, x, y) for (int i = x; i >= y; i--) #define vi vector<int> #define pb push_back #define mkp make_pair #define fi first #define se second #define gc getchar #define db double #define bs bitset #define ll long long #define lll __int128 #define ui unsigned int #define ull unsigned long long #define pii pair<int, int> #define clr(x) memset(x, 0, sizeof(x)) #define lbit(x) ((x) & (-(x))) #define heap priority_queue<int> #define Go(i, x, v) for (int i = 0, x = (i == v.size() ? 0 : v[i]); i < v.size(); i++, x = (i == v.size() ? 0 : v[i])) using namespace std; template <class T> void rd(T &x) { x = 0; char ch = gc(); int f = 1; for (; !isdigit(ch); ch = gc()) if (ch == '-') f = -1; for (; isdigit(ch); ch = gc()) x = (x << 1) + (x << 3) + ch - '0'; x *= f; } template <class T> void cmin(T &x, T y) { x = min(x, y); } template <class T> void cmax(T &x, T y) { x = max(x, y); } const int mod = 998244353; template <class T> T add(T x, T y) { return x + y >= mod ? x + y - mod : x + y; } template <class T> T sub(T x, T y) { return x - y < 0 ? x - y + mod : x - y; } template <class T> T mul(T x, T y) { return 1ll * x * y % mod; } template <class T> void Add(T &x, T y) { x = (x + y >= mod ? x + y - mod : x + y); } template <class T> void Sub(T &x, T y) { x = (x - y < 0 ? x - y + mod : x - y); } template <class T> void Mul(T &x, T y) { x = 1ll * x * y % mod; } template <class T> T qpow(T a, T b = mod - 2) { T ret = 1; for (; b; b >>= 1, Mul(a, a)) if (b & 1) Mul(ret, a); return ret; }
const int N = 1e5 + 10; int sz[N], rt, dep[N], son[5], q[5][N];
int aB(int x, int y) { return attractionsBehind(x - 1, y - 1); } int hR(int x, int y) { return hoursRequired(x - 1, y - 1); }
bool cmp(int x, int y) { return dep[x] < dep[y]; }
int mxd(int x, int y) { return dep[q[x][q[x][0] + y]]; }
vi createFunTour(int n, int Q) { rep(i, 1, n) sz[i] = aB(1, i); rep(i, 1, n) if (sz[i] >= (n + 1) / 2 && (!rt || sz[i] < sz[rt])) rt = i; rep(i, 1, n) { dep[i] = hR(rt, i); if (dep[i] == 1) son[++son[0]] = i; } rep(i, 1, n) if (i ^ rt) { bool flg = 0; rep(j, 1, son[0] - 1) if (dep[i] == 1 + hR(i, son[j])) { flg = 1; q[j][++q[j][0]] = i; break; } if (!flg) q[son[0]][++q[son[0]][0]] = i; } rep(i, 1, son[0]) { sort(q[i] + 1, q[i] + q[i][0] + 1, cmp); } vi ans; ans.clear(); int pre = 0, p = 0; per(i, n - 1, 1) { int cur = 0; if (p && pre != p) cur = p; else { rep(j, 1, son[0]) if (j ^ pre) { if (!p) { if ((q[j][0] * 2) > i || (q[j][0] * 2 == i && son[0] == 3 && (!pre || mxd(pre, 1) > mxd(6 - j - pre, 0)))) { cur = p = j; break; } } if (q[j][0] && (!cur || mxd(j, 0) > mxd(cur, 0))) cur = j; } } ans.pb(q[cur][q[cur][0]] - 1), --q[cur][0]; pre = cur; } ans.pb(rt - 1); return ans; }
|